﻿#define TEST 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
namespace VKontakteClient
{
    /// <summary>
    /// Дебаговый класс с методами записи в файл log.txt неких текстовых сообщений.
    /// </summary>
    static class DebugLog
    {
        /// <summary>
        /// Выдает отображение информации об ошибке(Exception) в диалоговом окне пользователя.
        /// </summary>
        /// <param name="e">Исключение для обработки</param>
        public static void DebugException(Exception e)
        {
            DebugException(e, false);
        }

        /// <summary>
        /// Выдает отображение информации об ошибке(Exception) в диалоговом окне пользователя.
        /// </summary>
        /// <param name="e">Исключение для обработки</param>
        /// <param name="local">Запускать ли в текущем потоке</param>
        public static void DebugException(Exception e, bool local)
        {
#if DEBUG || TEST
            StackTrace st = new StackTrace(e);
            string sMessage = "Список вызова методов:"; 
            sMessage += "\n" + string.Join("\n", st.GetFrames().Reverse().Select(v => v.GetMethod().DeclaringType.Name + "." + v.GetMethod().Name).ToArray());
            sMessage += "\r\n\r\nОшибка:" + e.Message;
            if (e!=null)
                if (e.InnerException != null) sMessage += "\r\nВнутренняя ошибка:" + e.InnerException;
            System.Threading.SendOrPostCallback func = (object o) =>
                    {
                        new Window()
                            {
                                Width = 400,
                                Height = 300,
                                WindowStyle = WindowStyle.ToolWindow,
                                VerticalContentAlignment = VerticalAlignment.Stretch,
                                Content = new StackPanel()
                                {
                                    HorizontalAlignment = HorizontalAlignment.Stretch,
                                    VerticalAlignment = VerticalAlignment.Stretch,
                                    Children = 
                                    {
                                        new Label() 
                                        { 
                                            Content = "Отправьте разработчику(g33k@g33k.ru) следующую информацию:" 
                                        },
                                        new TextBox() 
                                        { 
                                            VerticalAlignment= VerticalAlignment.Stretch,
                                            Text = sMessage 
                                        }
                                    }
                                },
                                Title = "Произошла критическая ошибка!"
                            }.Show();
#if DEBUG
                        Dump(sMessage);
#endif
                    };
            if (local || Main.sc == null)
                func(null);
            else
                Main.sc.Post(func, null);
#endif
        }
#if DEBUG
        /// <summary>
        /// Статический конструктор удаляет старый лог-файл.
        /// </summary>
        static DebugLog()
        {
            File.Delete("log.txt");
        }

        static object syncObject = new object();
        /// <summary>
        /// Отладочный метод сохраняет строку в файл.
        /// </summary>
        /// <param name="S">Строка для сохранения</param>
        public static void Dump(string S)
        {
            try
            {
                lock (syncObject)
                {
                    FileStream fs = new FileStream("log.txt", FileMode.Append);
                    StreamWriter sw = new StreamWriter(fs);
                    sw.Write(S);
                    sw.Close();
                    fs.Close();
                }
            }
            catch
            {
                System.Windows.MessageBox.Show("Не удалось сохранить в лог отладочную информацию");
            }
        }
#endif
    }
}
